package cn.iocoder.yudao.framework.datasource.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * 动态数据源配置属性
 *
 * @author 芋道源码
 */
@Data
@ConfigurationProperties(prefix = "spring.datasource.dynamic")
public class DynamicDataSourceProperties {

    /**
     * 是否启用动态数据源
     */
    private Boolean enabled = true;

    /**
     * 主数据源标识
     */
    private String primary = "master";

    /**
     * Druid连接池配置
     */
    private DruidConfig druid = new DruidConfig();

    @Data
    public static class DruidConfig {
        /**
         * 初始连接数
         */
        private Integer initialSize = 5;

        /**
         * 最小连接池数量
         */
        private Integer minIdle = 10;

        /**
         * 最大连接池数量
         */
        private Integer maxActive = 20;

        /**
         * 配置获取连接等待超时的时间，单位：毫秒
         */
        private Long maxWait = 60000L;

        /**
         * 配置间隔多久才进行一次检测，检测需要关闭的空闲连接，单位：毫秒
         */
        private Long timeBetweenEvictionRunsMillis = 60000L;

        /**
         * 配置一个连接在池中最小生存的时间，单位：毫秒
         */
        private Long minEvictableIdleTimeMillis = 600000L;

        /**
         * 配置一个连接在池中最大生存的时间，单位：毫秒
         */
        private Long maxEvictableIdleTimeMillis = 1800000L;

        /**
         * 配置检测连接是否有效
         */
        private String validationQuery = "SELECT 1 FROM DUAL";

        /**
         * 是否在空闲时检测连接有效性
         */
        private Boolean testWhileIdle = true;

        /**
         * 是否在获取连接时检测有效性
         */
        private Boolean testOnBorrow = false;

        /**
         * 是否在归还连接时检测有效性
         */
        private Boolean testOnReturn = false;

        /**
         * 是否开启 PreparedStatement 缓存
         */
        private Boolean poolPreparedStatements = true;

        /**
         * 每个连接缓存的 PreparedStatement 数量
         */
        private Integer maxPoolPreparedStatementPerConnectionSize = 20;
    }
}